Shader "Part1/MySurfshader"
{
	Properties
    {
//主纹理 是必须这样叫，unity强制规定
        _MainTex("MyTexture",2D) = "white"{}
        _MyNormalMap("NormalMap",2D) = "bump"{} //法线贴图
        _MyBumpScale("BumpScale",Range(0,1)) = 1.0 //凹凸程度
        _MySpecular("Specular",Color) = (1,1,1,1) //高光颜色
        _MyGloss("Gloss",Range(8.0,256)) = 20.0 //高光范围

        _MyInt("My integer",Int)  =2
        _MyFloat("My float",Float) = 1.5
        _MyRange("My Range",Range(0.0,1.0)) = 0.5

        _MyColor("My Color",Color) = (1,1,1,1)//颜色  (r,g,b,a)
        _MyVector("My Vector",Vector) = (1,1,1,1) //(x,y,z,w)

    }
//按顺序执行，兼容图形卡
// dX11
//dx9
//opengl2.0
//half4：half4 是一种中等精度的浮点类型，其每个分量占用 16 位。当处理一些对精度要求不高的数据时，如颜色值、方向向量、物体空间位置等，使用 half4 可以满足需求，同时减少内存占用和计算量。
// float4：float4 是一种高精度的浮点类型，每个分量占用 32 位。对于需要高精度计算的场景，如世界空间位置、纹理坐标或涉及复杂函数（如三角函数、幂函数等）的标量计算，float4 更为合适，以避免因精度不足导致的误差。
// 性能优化
// half4：在移动平台或某些对性能要求较高的场景中，使用 half4 可以显著提高性能。因为 half4 占用的内存更少，数据传输带宽需求也更低，这对于移动设备等资源受限的平台尤为重要。
// float4：虽然 float4 的精度更高，但其计算和存储成本也更高。如果在不需要高精度的场景中使用 float4，可能会导致不必要的性能开销。
// 硬件支持
// half4：并非所有硬件都支持 half 类型的直接计算。在一些桌面 GPU 上，half 类型可能会被自动转换为 float，但在移动 GPU 上，half 类型通常能得到更好的支持。
// float4：float4 作为一种广泛支持的标准浮点类型，在大多数硬件上都能直接使用，不会出现兼容性问题。
// 使用场景
// half4：适用于颜色表示、短向量、方向向量、物体空间位置等，这些场景对精度要求不高，但对性能和内存占用较为敏感。
// float4：适用于世界空间位置、纹理坐标、复杂的数学计算等，这些场景需要更高的精度以确保计算结果的准确性。
// 总的来说，Unity 提供 half4 和 float4 是为了满足不同场景下的精度和性能需求。开发者可以根据具体需求选择合适的数据类型，以实现性能和精度的最佳平衡
    SubShader
    {
        Tags{
             "Queue" = "Geometry"// 渲染队列 // 渲染队列是 Unity 中用于控制物体渲染顺序的技术。
             // 它决定了物体在屏幕上的渲染顺序，从而影响物体的遮挡关系和透明度。
             // 常见的渲染队列包括：
             // Background：背景队列，用于渲染背景物体，通常位于所有物体的最底层。
             // Geometry：几何队列，用于渲染普通的物体。         // 这是默认的渲染队列，用于渲染大部分物体。
             // AlphaTest：Alpha 测试队列，用于渲染带有 Alpha 通道的物体。
             // Transparent：透明队列，用于渲染带有透明度的物体。
             // Overlay：叠加队列，用于渲染在其他物体之上的物体。
             // 不同的渲染队列会影响物体的渲染顺序和透明度计算。
             // 例如，在一个场景中，背景物体通常位于所有物体的最底层，而前景物体通常位于所有物体的最上层。
             // 因此，背景物体的渲染队列应该设置为 Background，而前景物体的渲染队列应该设置为 Geometry。    
             // 当一个物体同时处于多个渲染队列中时，Unity 会按照渲染队列的优先级来决定渲染顺序。
             // 例如，在一个场景中，一个物体同时处于 Background 和 Geometry 两个渲染队列中，Unity 会先渲染 Background 队列中的物体，然后再渲染 Geometry 队列中的物体。
             // 这是因为 Background 队列的优先级更高，因此 Background 队列中的物体会先于 Geometry 队列中的物体渲染。    

             "RenderType" = "Opaque"
             }
             //渲染类型 告诉unity这个shader是一个不透明的shader
        //Tags{ "RenderType" = "Transparent"}//渲染类型 告诉unity这个shader是一个透明的shader
        //Tags{ "RenderType" = "Opaque" "Queue" = "Geometry"}//渲染类型 告诉unity这个shader是一个不透明的shader 并且在Geometry队列中
        //LOD 200 //LOD 是 Level of Detail 的缩写，它是一种用于控制物体细节层次的技术。在 Unity 中，LOD 用于控制物体在不同距离下的渲染质量。
        // 当物体距离摄像机较近时，Unity 会使用较低的 LOD 级别来渲染物体，以提高性能和减少资源消耗。
        // 当物体距离摄像机较远时，Unity 会使用较高的 LOD 级别来渲染物体，以获得更精细的细节和更好的视觉效果。
        LOD 200


        CGPROGRAM //CGPROGRAM 和 ENDCG 是 Unity 中用于编写着色器代码的标记，它们之间的代码将被 Unity 编译成 GPU 可执行的代码。
        #pragma surface surf Lambert //光照模型
        #pragma target 3.0 //opengl2.0
        struct Input{
            float2 uv_MainTex;// 纹理坐标
        }
        sampler2D _MainTex; //纹理
        sampler2D _MyNormalMap; //法线贴图
        float4 _MySpecular; //高光颜色
        float _MyGloss; //高光范围
        float _MyInt;
        float _MyFloat;
        float _MyRange;
        float4 _MyColor;
        float4 _MyVector;


        float _MyBumpScale; //凹凸程度 

      //in是unity的关键字，坑别踩
      //安装目录的CGIncludes文件夹下的cginc文件夹下的UnityCG.cginc文件中有很多有用的函数
        void surf (Input IN,inout SurfaceOutput o){ //大写的IN 是输入参数 o是输出参数
           //SurfaceOutput o是一个结构体，它包含了一些常用的输出参数，如颜色、法线、高光等。
           // 例如，o.Albedo 表示物体的颜色，o.Normal 表示物体的法线，o.Specular 表示物体的高光。
           // 这些参数都是通过计算得到的，然后赋值给 o 结构体中的对应字段。
           // 这样，在着色器中就可以通过 o 结构体来访问这些输出参数，从而实现对物体的渲染效果的控制。
           // 例如，在一个简单的着色器中，我们可以通过 o.Albedo 来设置物体的颜色，通过 o.Normal 来设置物体的法线，通过 o.Specular 来设置物体的高光。
            o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;// 纹理
            o.Normal = UnpackNormal(tex2D(_MyNormalMap,IN.uv_MainTex));// 法线贴图
            o.Normal *= _MyBumpScale; //凹凸程度
           
        }
        ENDCG
    }
}